﻿/** ***********************************************************************************
* @file         n808_app.c
* @brief    	国标808协议管理
* @details      主要用来处理808协议内容
* @author       
* @date         2021/5/27
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef _N808_APP_H
#define _N808_APP_H

#include "fibo_opencpu.h"
#include "national_data_process.h"
#include "os_app.h"
#include "gaoz_api.h"


#define		NET_AUTH_REASON_UNDEFINE		(0x00)	/*未知鉴权*/
#define		NET_AUTH_REASON_PERIODIC		(0x01)	/*周期性鉴权*/
#define		NET_AUTH_REASON_SEND_ERR		(0x02)	/*发送异常*/
#define		NET_AUTH_REASON_RECV_ERR		(0x03)	/*接收异常*/
#define		NET_AUTH_REASON_LINK_ERR		(0x04)	/*网络连接失败*/
#define		NET_AUTH_REASON_CSQ_ERR			(0x05)	/*网络信息状态异常*/
#define		NET_AUTH_REASON_REG_ERR			(0x06)	/*网络附着失败*/


#define PATIO_RX_BUF_SIZE      			(1 * 1024)	
#define RTC_NET_WAKEUP_TM      			(30)
#define ERR_CODE_CONFIG        			(100)  /* 错误码数量 */

#define S_VER_LEN           			9	
#define gz_sw_verno        				OS_SOFTWARE_VERSION
#define gz_serial          				"L610-CN-62-90"
#define gz_pcb_ver         				"18Plus16P_L610_V1.2"
#define	TERNIMAL_TYPE      				0x00
#define manufactureID	   				"GZCo."
#define H_ver_len						5
#define H_ver							"V1.09"
#define GAOZ_HW_TYPE1       			OS_HARDWARE_MODEL

#define USER_YH							0	/*亿华*/
#define USER_HXJH						0	/*华夏极狐*/				
#define	USER_ERR_CODE					0	/*是否使用错误码上次，0-不使用，1-使用*/

#define  USERODO_FROM_GPS	          	0    //用户设置里程-GPS統計
#define  USERSPEED_FROM_GPS	          	0    //用户車速GPS-yh
#define  USERCTLOCK_WITHOUT_LAMP      	1    //用户锁车不判断灯 

#if( OS_HALUO_PROJECT_ENABLE == 1 )  
#define  USER_AES_ENCRYPT_N800			1	/*数据传输协议使用AES加密方式 1-使用加密 0-不使用加密*/
#else
#define  USER_AES_ENCRYPT_N800			0 
#endif  

#pragma pack(1)
/*************************終端应答结果信息结构体**********************/
typedef struct
{
    uint16_t respondcmd; /* 应答命令 */
    uint16_t respondsn; /* 应答流水號 */
    uint8_t respondsta; /* 应答结果 */
} national808_net_devres_msg_t;

typedef enum
{
    CTLOCK_INIT = 0x00,
    CTLOCK_OK ,                 
    CTLOCK_PATIO_LOCK,  
    CTLOCK_PATIO_UNLOCK, 
    CTLOCK_BLE_LOCK,  
    CTLOCK_BLE_UNLOCK,
    CTLOCK_PATIO_SPK, 
    CTLOCK_BLE_SPK, 
	CTLOCK_PATIO_WIND, 
	CTLOCK_PKE_LOCK,  
    CTLOCK_PKE_UNLOCK,
    CTLOCK_PKE_SPK,                    
}national808_ctrllock_e;
/*************************控車结果信息结构体**********************/
typedef struct
{
    uint8_t lock_type; 
    national808_net_devres_msg_t lock_res;
    uint16_t lock_err;
} national808_ctrllock_msg_t;
/****************发送状态*********************************/
typedef enum
{
	N808_SEND_INIT = 0x00,
    N808_SEND_WAIT,        // 发送等待
    N808_SEND_OK,      	  // 发送成功
    N808_SENDRSP_OK,      // 发送应答成功
} national808_send_state_e;

typedef enum
{
    HAVE_NO_DATA = 0x00,                   
    HAVE_DATA,                      
}national808_have_e;

typedef enum
{
    NET_READY_FAIL = 0x00,                   
    NET_READY_OK,                      
}national808_netready_e;

typedef enum
{   
    NET_RST_INT = 0,
    NET_RST_START,
    NET_RST_END,
}net_reset_e;
/*************************平台应答结果信息结构体**********************/
typedef struct
{
	uint8_t *send_data;  /* 网络发送的数据 */
    uint16_t send_datalen;    /* 网络发送的数据长度 */
	national808_send_state_e send_st;  /* 网络发送的数据状态 */
    uint8_t have_data;  /* 需要发送的状态*/
} national808_data_st_t;
/*************************平台接受緩存结构体**********************/
typedef  struct
{
	uint16_t len;
	uint8_t *data;
}n808_patio_recv_buf_t;

typedef struct
{
    uint8_t update_types;//
    uint8_t update_result;//
}update_result_t; 

//终端参数
typedef struct { 
	uint8_t Subject;			//当做版本号
	uint8_t IP1Len;				
	char IP1[64];
	uint8_t Port1Len;
	char Port1[5];
	uint8_t IP2Len;
	char IP2[64];
	uint8_t Port2Len;
	char Port2[5];
	uint8_t Mode;				//终端工作模式 ：1--在线 0--离线
	uint8_t Voltage;			//电瓶电压
	uint8_t SpeedLimit;			//限速
	uint8_t ManageID[6];		//原来是4字节，现在改成6字节
	
	uint8_t KValue[2];      	//K值
	uint8_t Term_Num[6];	   	//终端手机号
	
	uint8_t CameraErr;	   		//摄像头故障标志  0-不启用，1-启用
	uint8_t PicInterval;    	//拍照时间间隔
	//uint8_t FallLimit[2];
	uint8_t VoiceSwitch;    	//语音提示开关  1-开  0-关
	
	/*
	//字库更新开关，初始为0，更新后为1
	改这个变量为特殊功能
	如果开机判断bit0==0，则改成=1，之后把IP和APN改成特殊固定值，
	西安10.170.1.5
	端口9000
	APN：xastjjzd.sn
	*/
	uint8_t ZKSwitch;       
	char APN[16];
	uint8_t   APNLen;
	char USER[16];
	uint8_t   USERLen;
	char PWD[16];
    uint8_t	 PWDLen;

	uint8_t	AuthCodeFlag;				//鉴权码，如果为A1代表已存储鉴权码，其它没有
	uint8_t  AuthCode[4];				//4字节鉴权码
	
	uint8_t ProvinceID[2];
	uint8_t TownID[2];

	//制造商ID, 终端型号 保存在IAP那个文件中了
	uint8_t CarColor;					//车牌颜色，按照JT/T415-2006 的5.4.12。未上牌时，取值为0。
	uint8_t CarMark[20];				//车牌颜色为0 时，表示车辆VIN；否则，表示公安交通管理部门颁发的机动车号牌。
	
	uint8_t heartBeatDly[4];			//终端心跳发送间隔，单位为秒（s）
	uint8_t idleReportMaxTime[4];		//休眠时汇报时间间隔，单位为秒（s）
	uint8_t workReportMaxTime[4];		//缺省时间汇报间隔，单位为秒（s）
	uint8_t idleReportMaxMeter[4];		//休眠时汇报距离间隔，单位为米（m），>0
	uint8_t workReportMaxMeter[4];		//缺省距离汇报间隔

	uint8_t ACConReportCellTime[4];		//点火时汇报时间间隔，单位为秒（s）
	uint8_t ACCoffReportCellTime[4];	//熄火时间汇报间隔，单位为秒（s）
	uint8_t adjustVol[2];			    //校准高压时，下发的校准值
	uint8_t rs0[16];
	uint8_t rs[38];
	uint8_t crashTime;
	uint8_t crashG;
	uint8_t CarAngle[2];

	//最初：车辆里程表读数，1/10km
	//之后把这个参数改成了其它用途，暂时只是用了CarKm[0],CarKm[1]，用作电话拨号号码长度限制
	//如果CarKm[1] != 0x01 则设置CarKm[1] = 0x01，且CarKm[0] = 6；
	uint8_t CarKm[4];
	uint8_t SpkTips;		//开机说一句话 = 1，说，0不说
	uint8_t SetPhone[110];	//保存10个手机号
 
	uint8_t Check;
	
}terminal_info_t;

//OTA参数
typedef enum
{   
	OTA_INIT = 0,
    OTA_FIRMWARE,
    OTA_APP,
    OTA_VEHICLE,
}upgrade_type_e;

typedef enum
{   
	URL_INIT = 0,
	URL_MAJOR,
    URL_MINOR,
}upgrade_url_e;

typedef struct { 
	upgrade_type_e upgrade_type;  	//01 firmware 02 app 03 vehicle
	upgrade_url_e upgrade_url;		
	uint8_t serveradr[256];			
	uint8_t version[50];			
	uint8_t md5[32];				
	uint8_t chk_xor;				
}terminal_ota_t;

typedef struct { 
	uint8_t key_sn;
	uint8_t key_encode[4];
	uint8_t key_rollcode[4];
}pkekey_dri_t;	

typedef struct { 
	pkekey_dri_t key_app[4];

}pkekey_dev_t;	

typedef enum
{
    N808_AUTH_SUCC = 0x00,			// 鉴权成功
    N808_AUTH_FAIL,					// 鉴权失败
} national_808_auth_e;

/***************************注册地址与静态地址枚举类型****************************/
typedef enum
{
	EXTERNAL_IP_ADDR = 0x00,		//外部平台地址
    INTERNAL_IP_ADDR = 0x01,		//内部平台地址     	  	     
} national_808_ip_addr_type_e;

/** *********************************************************************
 * @brief 网络命令控制消息队列
 * 
 ************************************************************************/
#define NATIONAL_CTRL_INFOR_NUM 	( 10 )
typedef struct 
{
	uint8_t 	count;				/*平台发送控制数量*/
	uint8_t 	state[NATIONAL_CTRL_INFOR_NUM];/*平台发送数量*/
}national_808_ctrl_infor_t;	

extern terminal_info_t	taginf;
extern terminal_ota_t terota_handle;
extern pkekey_dev_t pke_key;
extern uint8_t *gerr_code ;
/** ****************************************************************************
* @remarks       void national_808_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         808数据处理任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void national_808_create_task( unsigned portBASE_TYPE uxPriority );
/** ****************************************************************************
* @remarks      uint16_t positioninfo(uint8_t sel,uint8_t *da)
* @brief          位置信息
* @param[in]     sel 0:0504 1:0560
* @param[out]    da
* @return        length  
* @attention     
*******************************************************************************/
extern uint16_t positioninfo(uint8_t sel,uint8_t *da);
/** ****************************************************************************
* @remarks       void national_net_runing_state_set( national_run_state_e  state )
* @brief         设置国标平台运行状态
* @param[in]     state 运行状态
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void national808_net_runing_state_set( national_run_state_e  state );
/** ****************************************************************************
* @remarks       national_run_state_e national_net_runing_state_get( void )
* @brief         获取国标平台运行状态
* @param[in]     无
* @param[out]    无
* @return        运行状态
* @attention     在系统启动后进行创建
*******************************************************************************/
extern national_run_state_e national808_net_runing_state_get( void );
/** ****************************************************************************
* @remarks       national808_ctrllock_e national808_ctrllock_state_get( void )
* @brief         控锁状态
* @param[in]     无
* @param[out]    无
* @return        运行状态
* @attention     在系统启动后进行创建
*******************************************************************************/
extern national808_ctrllock_e national808_ctrllock_state_get( void );
/** ****************************************************************************
* @remarks       void national808_ctrllock_state_set( national808_ctrllock_e  state )
* @brief         设置控锁状态
* @param[in]     state 运行状态
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void national808_ctrllock_state_set( national808_ctrllock_e  state );
/** ****************************************************************************
* @remarks       uint32_t national808_net_devres_queue_get( national_net_res_msg_t *res_msg , uint32_t delay_time )
* @brief         获取消息队列
* @param[in]     *res_msg 获取的数据地址
* @param[in]     delay_time 等待的时间
* @param[out]    无
* @return        pdPASS 接收数据成功 ，pdFAIL 接收数据失败
* @attention     无
*******************************************************************************/
extern uint32_t national808_ctlock_queue_get( national808_ctrllock_msg_t *res_msg , uint32_t delay_time );
/** ****************************************************************************
* @remarks       uint8_t national808_ctlock_queue_put( national_net_res_msg_t *res_msg )
* @brief         发送数据
* @param[in]     *res_msg 发送的数据地址
* @param[out]    无
* @return        1 发送数据成功 ，0 发送数据失败
* @attention     无
*******************************************************************************/
extern uint8_t national808_ctlock_queue_put( national808_ctrllock_msg_t *res_msg );
/** ****************************************************************************
* @remarks       uint8_t national808_ctlock_res_queue_put( national_net_res_msg_t *res_msg )
* @brief         发送数据
* @param[in]     *res_msg 发送的数据地址
* @param[out]    无
* @return        1 发送数据成功 ，0 发送数据失败
* @attention     无
*******************************************************************************/
extern uint8_t national808_ctlock_res_queue_put( national808_ctrllock_msg_t *res_msg );
/** ****************************************************************************
* @remarks       uint8_t national808_upgrade_queue_put( national_net_res_msg_t *res_msg )
* @brief         发送数据
* @param[in]     *res_msg 发送的数据地址
* @param[out]    无
* @return        1 发送数据成功 ，0 发送数据失败
* @attention     无
*******************************************************************************/
extern uint8_t national808_upgrade_queue_put( update_result_t *res_msg );
/** ****************************************************************************
* @remarks      uint32_t setrelay_sta(uint8_t data)
* @brief        断电继电器状态
* @param[in]     
* @param[out]    
* @return        
* @attention     
*******************************************************************************/
extern uint32_t setrelay_sta(uint8_t data);

/** ****************************************************************************
* @remarks      uint32_t setrelay_sta(uint8_t data)
* @brief        读取断电继电器状态
* @param[in]     无
* @param[out]    继电器状态
* @return       pdPASS成功  pdFAIL失败
* @attention     
*******************************************************************************/
extern uint32_t readrelay_sta( uint8_t *data );

/** ****************************************************************************
* @remarks       uint8_t init_paratable(uint8_t * ManageID,uint8_t *da,uint16_t *len)
* @brief          初始参数表
* @param[in]      
* @param[out]    
* @return         0成功 
* @attention     
*******************************************************************************/
extern uint8_t init_paratable(uint8_t * ManageID,uint8_t *da,uint16_t *len);
/** ****************************************************************************
* @remarks      uint32_t gzlable_eraseid(void)
* @brief         
* @param[in]     
* @param[out]    无
* @return        pdPASS成功 ，  pdFAIL失败
* @attention     无
*******************************************************************************/
extern uint32_t gzlable_eraseid(void);
/** ****************************************************************************
* @remarks      uint32_t gzlable_print(uint8_t *pDa, uint16_t *pDlen) 
* @brief         
* @param[in]     
* @param[out]    无
* @return        pdPASS成功 ，  pdFAIL失败
* @attention     无
*******************************************************************************/
extern uint32_t gzlable_print(uint8_t *pDa, uint16_t *pDlen, uint8_t flag); 
/** ****************************************************************************
* @remarks       uint32_t savemajorip(terminal_info_t *info,uint8_t flag)
* @brief         存储参数表
* @param[in]     参数表，标记
* @param[out]    无
* @return        1失败 0成功
* @attention
*******************************************************************************/
extern uint32_t savemajorip(terminal_info_t *info,uint8_t flag);
/** ****************************************************************************
* @remarks      uint32_t gzlable_exchangeip(uint8_t *pDa, uint16_t pDlen)
* @brief        
* @param[in]     无
* @param[out]    无
* @return        pdPASS成功 ，  pdFAIL失败
* @attention     无
*******************************************************************************/
extern uint32_t gzlable_exchangeip(uint8_t *pDa, uint16_t pDlen);
/** ****************************************************************************
* @remarks       void wakeup_source_set( wakeup_source_e flag )
* @brief         
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     
*******************************************************************************/
extern void wakeup_source_set( wakeup_source_e flag );
/** ****************************************************************************
* @remarks       wakeup_source_e wakeup_source_get( void )
* @brief         
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     
*******************************************************************************/
extern wakeup_source_e wakeup_source_get( void );
/** ****************************************************************************
* @remarks      uint16_t uploadposition(uint8_t *pDa)
* @brief        加载位置信息
* @param[in]     无
* @param[out]    *pDa缓存区
* @return       缓存区长度 
* @attention     
*******************************************************************************/
extern uint16_t uploadposition(uint8_t *pDa);

/** ****************************************************************************
* @remarks       uint32_t national808_net_ctrl_infor_set( national_run_state_e st )
* @brief         设置平台命令发送消息体数据
* @param[in]     st 控制状态
* @param[out]    无
* @return        pdFAIL - 设置失败，pdPASS - 设置成功
* @attention     无
*******************************************************************************/
extern uint32_t national808_net_ctrl_infor_set( uint8_t st );

/** ****************************************************************************
* @remarks       uint32_t national808_net_ctrl_infor_get( national_run_state_e st )
* @brief         获取平台命令发送消息体数据
* @param[in]     
* @param[out]    *st 控制状态指针 
* @return        pdFAIL - 获取失败，pdPASS - 获取成功
* @attention     无
*******************************************************************************/
extern uint32_t national808_net_ctrl_infor_get( uint8_t *st );

/** ****************************************************************************
* @remarks      void get_n808_taginf_vin(uint8_t *vin)
* @brief        获取主平台存储的VIN
* @param[in]    获取VIN的存储地址
* @param[out]   主平台VIN
* @return       缓存区长度
* @attention     
*******************************************************************************/
extern void get_n808_taginf_vin(uint8_t *vin);

/** ****************************************************************************
* @remarks       void auth_reason_set(uint8_t reason)
* @brief         鉴权原因设置
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void national808_auth_reason_set(uint8_t reason);

/** ****************************************************************************
* @remarks       uint8_t national808_auth_reason_get(void)
* @brief         鉴权原因获取
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint8_t national808_auth_reason_get(void);

/** ****************************************************************************
* @remarks       static uint16_t network_data_vehicle_fault_code_transmission( uint8_t *da )
* @brief         故障码应答数据上传
* @param[in]     无
* @param[out]    *da缓存区
* @return        缓存区长度
* @attention     
*******************************************************************************/
extern  uint16_t network_data_vehicle_fault_code_transmission( uint8_t *da );

 

#endif

